/*
 * stdlix.h
 *
 *  Created on: 2012-5-23
 *      Author: qinsiyuan
 */

#ifndef STDLIX_H_
#define STDLIX_H_

/*
 * 涉嫌需要的头文件
 */
#include<stddef.h>
#include<unistd.h>
#include<pthread.h>
#include<stdio.h>
#include<stdlib.h>
#include"soc.h"

/*
 * 内存对齐
 */
#pragma pack(1)

/*
 * 常用常量
 */
#define TRUE 1
#define FALSE 0

/*
 * 网关编号
 */
#define DEFAULT_GATEWAY_NUM 111 //默认内部网关标号
#define PUBLIC_PRIVATE_GATEWAY_NUM_SWITCH 10 //内部编号和外部编号的转换变量

/*
 * 长度
 */
#define NOD_MESSAGE_DATA_LENGTH 4 //节点信息长度
#define SERVER_MESSAGE_DATA_LENGTH 18 //服务器信息长度
#define COMMEN_INTEGER 2
#define ADDRESS_LENGTH 64 //地址长度
#define K 1024 //千字节
#define MAX_NODE_COUNT 10 //最大节点数

/*
 * 时间间隔
 */
#define GATEWAY_BURN_SLEEP_TIME 5 //出生间隔
#define TIME_LIMITE 10 //设置接受节点信息的超时时间

/*
 * 地址
 */
#define SERVER_ADDRESS "2001:da8:bf:15:ec78:a581:2dc7:a715"//服务器
#define LOOP_BACK_ADDRESS "::1"//回环地址
#define TUN_ADDRESS "aaaa::1" //tun口地址
#define SETTINGS_ADDRESS "/etc/gatewaySettings" //设置地址
#define SERVER_PORT 8080 //服务器接收网关消息端口、网关接收服务器消息端口

/*
 * 命令
 */
#define NODE_BORN 1 //节点出生
#define GATEWAY_BORN 2 //网关出生
#define NODE_HEART 3 //节点心跳
#define DATA 10 //节点返回请求温度湿度数据
#define REQUEST_DATA 11 //服务器请求温度湿度数据
#define REQUEST_IP_ADDRESS 12 //服务器请求IP地址
#define ERROR 20 //错误
#define NO_IP_ADDRESS 21 //无IP地址错误
#define STOP_ACCEPT 22 //帮助跳出accept阻塞，不会出现在网络通讯中

/*
 *网关编号
 */
int gatewayNum;

/*
 *监听服务器的socket
 */
int listensock;
/*
 * tun地址
 */
char tunAddress[ADDRESS_LENGTH];
/*
 * 与节点通信的标准结构体
 */
typedef struct nodmes
{
	char order;
	char data[NOD_MESSAGE_DATA_LENGTH];
} NodMessage;

/*
 * 与服务器通讯的标准结构体
 */
typedef struct sermes
{
	char order;
	char data[SERVER_MESSAGE_DATA_LENGTH];
} ServerMessage;

/*
 * 网关出生信息、服务器的请求
 */
typedef struct knowNumber
{
	char order;
	unsigned short num;
}ServerSwitchOn,ServerForRequest;

/*
 * 向节点请求
 */
typedef struct nodRequest
{
	char order;
	char num;
}NodForRequest;

/*
 * 向服务器发送温度和湿度信息
 */
typedef struct serData
{
	char order;
	unsigned short num;
	short temperature ;
	char humidity;
}ServerData;

/*
 * 收到节点发送的温度和湿度信息
 */
typedef struct nodData
{
	char order;
	char num;
	short temperature;
	char humidity;
}NodeData;

/*
 * 接收到服务器发送的获取IP地址的请求
 */
typedef struct serForNodAddress
{
	char order;
	unsigned short num;
	char ipaddress[16];
}ServerForNodAddress;

//leiyu start
char send_seq[7];
char data_seq[7];
char heart_seq[7];
//leiyu end

/*
 * 节点和地址的映射表
 */
struct in6_addr table[MAX_NODE_COUNT];

/*
 * 用来存储节点返回数据的数据结构
 */
typedef struct node_data
{
	int access;
	ServerMessage message;

} Ndata;

/*
 * 存储节点数据的缓冲区
 */
Ndata nodebuff[7];

#endif /* STDLIX_H_ */
